package com.dataseek.iot.core.base;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dataseek.iot.core.request.QueryPage;
import com.dataseek.iot.core.request.QueryParam;
import com.dataseek.iot.core.response.ResponseEntity;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * @author cc
 * @Title: 访问接口
 * @Description: 统一访问接口格式
 * @date 2021/9/711:32 上午
 * @since 1.0
 */
public interface IController<T> {
    /**
     * 保存单个数据
     * @param entity
     * @return
     */
   Mono<ResponseEntity> saveOne(T entity);

    /**
     * 批量保存数据
     * @param lists
     * @return
     */
   Mono<ResponseEntity> saveBatch(List<T> lists);


    /**
     * 根据ID集合移除数据
     * @param ids
     * @return
     */
   Mono<ResponseEntity> removeAll(List<String> ids);

    /**
     * 根据条件移除数据
     * @param params
     * @return
     */
   Mono<ResponseEntity> remove(List<QueryParam> params);

    /**
     * 根据ID移除数据
     * @param id
     * @return
     */
   Mono<ResponseEntity> remove(String id);

    /**
     * 更新数据
     * @param entity
     * @return
     */
   Mono<ResponseEntity> updateOne(T entity);

    /**
     * 根据条件更新数据
     * @param params
     * @return
     */
   Mono<ResponseEntity> update(List<QueryParam> params);

    /**
     * 批量更新
     * @param entities
     * @return
     */
   Mono<ResponseEntity> updateBatch(List<T> entities);

    /**
     * 根据ID查询数据
     * @param id
     * @return
     */
   Mono<ResponseEntity> findOne(String id);

    /**
     * 分页查询所有
     * @return
     */
   Mono<ResponseEntity> page(Page p);

    /**
     * 带条件分页查询所有
     * @param queryPage
     * @return
     */
   Mono<ResponseEntity> page(QueryPage queryPage);

    /**
     * 根据ID集合查看所有数据
     * @param ids
     * @return
     */
   Flux<ResponseEntity> findByIds(List<String> ids);

    /**
     * 根据条件查询数据
     * @param params
     * @return
     */
   Flux<ResponseEntity> find(List<QueryParam> params);

    /**
     * 不带分页的查询所有数据
     * @return
     */
   Flux<ResponseEntity> findAll();

    /**
     * 查询
     * @param json 传参为json
     * @return
     */
   Flux<ResponseEntity> find(JSONObject json);

    /**
     * 分页查询
     * @param json 传参为json
     * @return
     */
   Mono<ResponseEntity> page(JSONObject json);
}
